{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3a3b7d86",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " 词汇表： ['Kage', 'is', 'Boss', 'Xiaobing', 'Mazong', 'Student', 'Xiaoxue', 'Niuzong', 'Teacher']\n",
      " 词汇到索引的字典： {'Kage': 0, 'is': 1, 'Boss': 2, 'Xiaobing': 3, 'Mazong': 4, 'Student': 5, 'Xiaoxue': 6, 'Niuzong': 7, 'Teacher': 8}\n",
      " 索引到词汇的字典： {0: 'Kage', 1: 'is', 2: 'Boss', 3: 'Xiaobing', 4: 'Mazong', 5: 'Student', 6: 'Xiaoxue', 7: 'Niuzong', 8: 'Teacher'}\n",
      " 词汇表大小： 9\n"
     ]
    }
   ],
   "source": [
    "# 定义一个句子列表，后面会用这些句子来训练 CBOW 和 Skip-Gram 模型\n",
    "sentences = [\"Kage is Teacher\", \"Mazong is Boss\", \"Niuzong is Boss\",\n",
    "             \"Xiaobing is Student\", \"Xiaoxue is Student\",]\n",
    "# 将所有句子连接在一起，然后用空格分隔成多个单词\n",
    "words = ' '.join(sentences).split()\n",
    "# 构建词汇表，去除重复的词\n",
    "word_list = list(set(words))\n",
    "# 创建一个字典，将每个词映射到一个唯一的索引\n",
    "word_to_idx = {word: idx for idx, word in enumerate(word_list)}\n",
    "# 创建一个字典，将每个索引映射到对应的词\n",
    "idx_to_word = {idx: word for idx, word in enumerate(word_list)}\n",
    "voc_size = len(word_list) # 计算词汇表的大小\n",
    "print(\" 词汇表：\", word_list) # 输出词汇表\n",
    "print(\" 词汇到索引的字典：\", word_to_idx) # 输出词汇到索引的字典\n",
    "print(\" 索引到词汇的字典：\", idx_to_word) # 输出索引到词汇的字典\n",
    "print(\" 词汇表大小：\", voc_size) # 输出词汇表大小"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a78a1f96",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Skip-Gram 数据样例（未编码）： [('is', 'Kage'), ('Teacher', 'Kage'), ('Kage', 'is')]\n"
     ]
    }
   ],
   "source": [
    "# 生成 Skip-Gram 训练数据\n",
    "def create_skipgram_dataset(sentences, window_size=2):\n",
    "    data = [] # 初始化数据\n",
    "    for sentence in sentences: # 遍历句子\n",
    "        sentence = sentence.split()  # 将句子分割成单词列表\n",
    "        for idx, word in enumerate(sentence):  # 遍历单词及其索引\n",
    "            # 获取相邻的单词，将当前单词前后各 N 个单词作为相邻单词\n",
    "            for neighbor in sentence[max(idx - window_size, 0): \n",
    "                        min(idx + window_size + 1, len(sentence))]:\n",
    "                if neighbor != word:  # 排除当前单词本身\n",
    "                    # 将相邻单词与当前单词作为一组训练数据\n",
    "                    data.append((neighbor, word))\n",
    "    return data\n",
    "# 使用函数创建 Skip-Gram 训练数据\n",
    "skipgram_data = create_skipgram_dataset(sentences)\n",
    "# 打印未编码的 Skip-Gram 数据样例（前 3 个）\n",
    "print(\"Skip-Gram 数据样例（未编码）：\", skipgram_data[:3])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "56fd0f7b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "One-Hot 编码前的单词： Teacher\n",
      "One-Hot 编码后的向量： tensor([0., 0., 0., 0., 0., 0., 0., 0., 1.])\n",
      "Skip-Gram 数据样例（已编码）： [(tensor([0., 1., 0., 0., 0., 0., 0., 0., 0.]), 0), (tensor([0., 0., 0., 0., 0., 0., 0., 0., 1.]), 0), (tensor([1., 0., 0., 0., 0., 0., 0., 0., 0.]), 1)]\n"
     ]
    }
   ],
   "source": [
    "# 定义 One-Hot 编码函数\n",
    "import torch # 导入 torch 库\n",
    "def one_hot_encoding(word, word_to_idx):    \n",
    "    tensor = torch.zeros(len(word_to_idx)) # 创建一个长度与词汇表相同的全 0 张量  \n",
    "    tensor[word_to_idx[word]] = 1  # 将对应词的索引设为 1\n",
    "    return tensor  # 返回生成的 One-Hot 向量\n",
    "# 展示 One-Hot 编码前后的数据\n",
    "word_example = \"Teacher\"\n",
    "print(\"One-Hot 编码前的单词：\", word_example)\n",
    "print(\"One-Hot 编码后的向量：\", one_hot_encoding(word_example, word_to_idx))\n",
    "# 展示编码后的 Skip-Gram 训练数据样例\n",
    "print(\"Skip-Gram 数据样例（已编码）：\", [(one_hot_encoding(context, word_to_idx), \n",
    "          word_to_idx[target]) for context, target in skipgram_data[:3]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "fd3726b9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Skip-Gram 模型： SkipGram(\n",
      "  (input_to_hidden): Linear(in_features=9, out_features=2, bias=False)\n",
      "  (hidden_to_output): Linear(in_features=2, out_features=9, bias=False)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "# 定义 Skip-Gram 类\n",
    "import torch.nn as nn # 导入 neural network\n",
    "class SkipGram(nn.Module):\n",
    "    def __init__(self, voc_size, embedding_size):\n",
    "        super(SkipGram, self).__init__()\n",
    "        # 从词汇表大小到嵌入层大小（维度）的线性层（权重矩阵）\n",
    "        self.input_to_hidden = nn.Linear(voc_size, embedding_size, bias=False)  \n",
    "        # 从嵌入层大小（维度）到词汇表大小的线性层（权重矩阵）\n",
    "        self.hidden_to_output = nn.Linear(embedding_size, voc_size, bias=False)  \n",
    "    def forward(self, X): # 前向传播的方式，X 形状为 (batch_size, voc_size)      \n",
    "         # 通过隐藏层，hidden 形状为 (batch_size, embedding_size)\n",
    "            hidden = self.input_to_hidden(X) \n",
    "            # 通过输出层，output_layer 形状为 (batch_size, voc_size)\n",
    "            output = self.hidden_to_output(hidden)  \n",
    "            return output    \n",
    "embedding_size = 2 # 设定嵌入层的大小，这里选择 2 是为了方便展示\n",
    "skipgram_model = SkipGram(voc_size, embedding_size)  # 实例化 Skip-Gram 模型\n",
    "print(\"Skip-Gram 模型：\", skipgram_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "65cb5973",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 100, Loss: 2.185371478398641\n",
      "Epoch: 200, Loss: 2.1666799863179524\n",
      "Epoch: 300, Loss: 2.1495420654614765\n",
      "Epoch: 400, Loss: 2.132016674677531\n",
      "Epoch: 500, Loss: 2.112655508518219\n",
      "Epoch: 600, Loss: 2.090042777856191\n",
      "Epoch: 700, Loss: 2.0625747720400494\n",
      "Epoch: 800, Loss: 2.028611993789673\n",
      "Epoch: 900, Loss: 1.9874194343884786\n",
      "Epoch: 1000, Loss: 1.9409883141517639\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 训练 Skip-Gram 类\n",
    "learning_rate = 0.001 # 设置学习速率\n",
    "epochs = 1000 # 设置训练轮次\n",
    "criterion = nn.CrossEntropyLoss()  # 定义交叉熵损失函数\n",
    "import torch.optim as optim # 导入随机梯度下降优化器\n",
    "optimizer = optim.SGD(skipgram_model.parameters(), lr=learning_rate)  \n",
    "# 开始训练循环\n",
    "loss_values = []  # 用于存储每轮的平均损失值\n",
    "for epoch in range(epochs):\n",
    "    loss_sum = 0 # 初始化损失值\n",
    "    for context, target in skipgram_data:        \n",
    "        X = one_hot_encoding(target, word_to_idx).float().unsqueeze(0) # 将中心词转换为 One-Hot 向量  \n",
    "        y_true = torch.tensor([word_to_idx[context]], dtype=torch.long) # 将周围词转换为索引值 \n",
    "        y_pred = skipgram_model(X)  # 计算预测值\n",
    "        loss = criterion(y_pred, y_true)  # 计算损失\n",
    "        loss_sum += loss.item() # 累积损失\n",
    "        optimizer.zero_grad()  # 清空梯度\n",
    "        loss.backward()  # 反向传播\n",
    "        optimizer.step()  # 更新参数\n",
    "    if (epoch+1) % 100 == 0: # 输出每 100 轮的损失，并记录损失\n",
    "      print(f\"Epoch: {epoch+1}, Loss: {loss_sum/len(skipgram_data)}\")  \n",
    "      loss_values.append(loss_sum / len(skipgram_data))\n",
    "# 绘制训练损失曲线\n",
    "import matplotlib.pyplot as plt # 导入 matplotlib\n",
    "# 绘制二维词向量图\n",
    "plt.rcParams[\"font.family\"]=['SimHei'] # 用来设定字体样式\n",
    "plt.rcParams['font.sans-serif']=['SimHei'] # 用来设定无衬线字体样式\n",
    "plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号\n",
    "plt.plot(range(1, epochs//100 + 1), loss_values) # 绘图\n",
    "plt.title(' 训练损失曲线 ') # 图题\n",
    "plt.xlabel(' 轮次 ') # X 轴 Label\n",
    "plt.ylabel(' 损失 ') # Y 轴 Label\n",
    "plt.show() # 显示图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "b9ba6bcb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Skip-Gram 词嵌入：\n",
      "Kage: [-0.4890965 -0.1904845]\n",
      "is: [-0.05358342 -0.49305108]\n",
      "Boss: [-0.3772864  1.122704 ]\n",
      "Xiaobing: [-0.15191597 -0.1434522 ]\n",
      "Mazong: [-0.81990975  0.35894954]\n",
      "Student: [0.5589041  0.47023773]\n",
      "Xiaoxue: [-0.03153982 -0.23713078]\n",
      "Niuzong: [-0.71763086  0.22707257]\n",
      "Teacher: [0.59581107 0.69417   ]\n"
     ]
    }
   ],
   "source": [
    "# 输出 Skip-Gram 习得的词嵌入\n",
    "print(\"Skip-Gram 词嵌入：\")\n",
    "for word, idx in word_to_idx.items(): # 输出每个词的嵌入向量\n",
    " print(f\"{word}: {skipgram_model.input_to_hidden.weight[:,idx].detach().numpy()}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e58f6b82",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots() \n",
    "for word, idx in word_to_idx.items():\n",
    "    # 获取每个单词的嵌入向量\n",
    "    vec = skipgram_model.input_to_hidden.weight[:,idx].detach().numpy() \n",
    "    ax.scatter(vec[0], vec[1]) # 在图中绘制嵌入向量的点\n",
    "    ax.annotate(word, (vec[0], vec[1]), fontsize=12) # 点旁添加单词标签\n",
    "plt.title(' 二维词嵌入 ') # 图题\n",
    "plt.xlabel(' 向量维度 1') # X 轴 Label\n",
    "plt.ylabel(' 向量维度 2') # Y 轴 Label\n",
    "plt.show() # 显示图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8a329336",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
